#include "crypto_common.h"

// 独立的密钥生成程序
int main() {
    crypto_context_t ctx;
    char key_file[512];
    char password[256];
    int use_password;
    
    printf("=== 密钥文件生成工具 ===\n\n");
    
    printf("是否使用密码生成密钥? (1=是, 0=否): ");
    scanf("%d", &use_password);
    
    if (use_password) {
        printf("请输入密码: ");
        scanf("%s", password);
    }
    
    printf("请输入密钥文件保存路径: ");
    scanf("%s", key_file);
    
    // 初始化随机数生成器
    secure_random_init();
    
    // 设置复杂度级别
    ctx.complexity_level = 3;
    
    // 生成随机盐值
    generate_secure_random(ctx.salt, SALT_LENGTH);
    
    // 生成随机种子
    ctx.seed = (uint32_t)time(NULL) ^ (uint32_t)rand();
    
    // 生成主密钥
    if (use_password && strlen(password) > 0) {
        unsigned char hash_output[32];
        hash_function((const unsigned char*)password, strlen(password), hash_output);
        
        // 扩展哈希到完整密钥长度
        for (int i = 0; i < KEY_LENGTH; i++) {
            ctx.primary_key[i] = hash_output[i % 32] ^ (unsigned char)(i * 37);
        }
        printf("使用密码生成密钥...\n");
    } else {
        // 生成随机主密钥
        generate_secure_random(ctx.primary_key, KEY_LENGTH);
        printf("生成随机密钥...\n");
    }
    
    // 派生所有轮密钥
    derive_keys(&ctx);
    
    // 保存密钥文件
    FILE *fp = fopen(key_file, "wb");
    if (!fp) {
        printf("无法创建密钥文件: %s\n", key_file);
        return 1;
    }
    
    // 写入魔术字节标识
    const char magic[] = "SECKEY01";
    fwrite(magic, 1, 8, fp);
    
    // 写入上下文数据
    fwrite(&ctx, sizeof(crypto_context_t), 1, fp);
    
    fclose(fp);
    
    printf("密钥文件生成成功: %s\n", key_file);
    printf("文件大小: %ld 字节\n", sizeof(crypto_context_t) + 8);
    
    if (use_password) {
        printf("注意: 解密时需要相同的密码!\n");
    } else {
        printf("注意: 此密钥文件是随机生成的，请妥善保管!\n");
    }
    
    // 清除内存中的敏感数据
    memset(&ctx, 0, sizeof(crypto_context_t));
    memset(password, 0, sizeof(password));
    
    return 0;
}